﻿using System;
using System.Data.SqlClient;

public partial class Services_ConfigurarCuenta : System.Web.UI.Page
{
    private String _SessionID;
    private String _UserType;
    private String _MatriculaOrNomina; // Para el nombre de la tabla de la BD

    protected void Page_Load(object sender, EventArgs e)
    {
        SessionValidation();

        if (Session["UsuarioStatus"] != null)
        {
            UserStatusDiv.Visible = true;
            UsuarioStatus.Text = (String)Session["UsuarioStatus"];
            Session.Remove("UsuarioStatus");
        }

        if (String.Equals(_UserType, "Alumnos"))
        {
            _MatriculaOrNomina = "Matricula";
            LegendTitle.InnerHtml = "<strong>Datos del Alumno</strong>";
            LabelMatriculaNomina.Text = "<strong>Matr&iacute;cula:</strong>";
            FechaNacimientoDiv.Visible = true;
            FillData(_SessionID);
        }
        else if (String.Equals(_UserType, "Administradores"))
        {
            _MatriculaOrNomina = "Nomina";
            LegendTitle.InnerHtml = "<strong>Datos del Administrador</strong>";
            LabelMatriculaNomina.Text = "<strong>N&oacute;mina:</strong>";
            FillData(_SessionID);
        }
        else
        {
            Session.RemoveAll();
            Response.Redirect("~/Default.aspx");
        }

        // Modifica la manera en que se acomodan los inputs en la forma
        Form.Attributes["class"] = ".form-vertical";
    }


    // Carga los datos del usuario que esta logueado actualmente
    protected void FillData(String MatriculaOrNominaId)
    {
        DatabaseConnection dbCon = new DatabaseConnection();
        // Se crea un Query Parametrizado
        String ParameterizedQueryString = String.Format("SELECT * FROM " + _UserType + " WHERE {0} = @SessionID", _MatriculaOrNomina);
        SqlCommand ParameterizedQuery = new SqlCommand(ParameterizedQueryString);
        ParameterizedQuery.Parameters.Add(new SqlParameter("@SessionID", _SessionID));

        using (SqlDataReader userReader = dbCon.ParameterizedExecuteSelect(ParameterizedQuery))
        {
            if (userReader.Read())
            {
                MatriculaText.Text = (String)userReader[_MatriculaOrNomina];
                PrimerNombreText.Text = (String)userReader["Nombre"];
                ApellidoText.Text = (String)userReader["Apellido"];
                
                if(String.Equals(_UserType, "Alumnos"))
                {
                    DateTime FN = (DateTime)userReader["FechaNacimiento"];
                    FechaNacimientoText.Text = FN.ToString("dd / MM / yyyy");
                }
            }
        }
        dbCon.CloseConnection();
    }


    // Invierte los valores de los controles para cambiar el password
    protected void ChangeControlValues(Boolean flag)
    {
        CambioPasswordDiv.Visible = !flag;
        LastPasswordDiv.Visible = flag;
        NewPasswordDiv.Visible = flag;
        NewPasswordConfirmDiv.Visible = flag;
        SubmitNewPassword.Visible = flag;
        CancelNewPassword.Visible = flag;
    }

    // Activa los controles para que se pueda cambiar el password
    protected void CambioPasswordClick(object sender, EventArgs e)
    {
        ChangeControlValues(true);
        PasswordChangeErrorDiv.Visible = false;
    }


    // Desactiva los controles para que se pueda cambiar el password
    protected void CancelNewPasswordClick(object sender, EventArgs e)
    {
        ChangeControlValues(false);
        PasswordChangeErrorDiv.Visible = false;
    }


    // Se actualiza al nuevo password
    protected void SubmitNewPasswordClick(object sender, EventArgs e)
    {
        DatabaseConnection dbCon = new DatabaseConnection();
        if (!String.Equals(_UserType, "Alumnos") && !String.Equals(_UserType, "Administradores"))
        {
            Session["UsuarioStatus"] =
                "<div class='alert alert-error' align='center'><strong>Acci&oacute;n denegada por seguridad</strong></div>";
            Response.Redirect("~/Services/CrearCuenta.aspx");
        }

        // Se crea un Query Parametrizado
        String ParameterizedQueryString = String.Format("SELECT * FROM " + _UserType + " WHERE {0} = @SessionID", _MatriculaOrNomina);
        SqlCommand ParameterizedQuery = new SqlCommand(ParameterizedQueryString);
        ParameterizedQuery.Parameters.Add(new SqlParameter("@SessionID", _SessionID));

        using (SqlDataReader passwordReader = dbCon.ParameterizedExecuteSelect(ParameterizedQuery))
        {
            if (passwordReader.Read())
            {
                // Se genera el Hash de la contraseña proporcionada para verificar que coincidan
                SecurityTools secTools = new SecurityTools();

                String LastPasswordSalt = (String)passwordReader["Salt"];
                String LastPasswordHash = (String)passwordReader["Contrasena"];
                String LastPassword = secTools.HashPassword(LastPasswordTextBox.Text + LastPasswordSalt);

                if (String.Equals(LastPasswordHash, LastPassword))
                {
                    passwordReader.Close();

                    // Se genera el Hash y Salt para la nueva contraseña
                    String PasswordSalt = secTools.SaltGenerator();
                    String PasswordHash = secTools.HashPassword(ContrasenaTextBox.Text + PasswordSalt);

                    String InsertNewPasswordString =
                        String.Format(
                            "UPDATE \"" + _UserType +
                            "\" SET Contrasena = @PasswordHash, Salt = @PasswordSalt WHERE {0} = @SessionID",
                            _MatriculaOrNomina);

                    // Se crea un Query Parametrizado
                    using (SqlCommand InsertNewPassword = new SqlCommand(InsertNewPasswordString))
                    {
                        InsertNewPassword.Parameters.Add(new SqlParameter("@PasswordHash", PasswordHash));
                        InsertNewPassword.Parameters.Add(new SqlParameter("@PasswordSalt", PasswordSalt));
                        InsertNewPassword.Parameters.Add(new SqlParameter("@SessionID", _SessionID));
                        int rowsAffected = dbCon.ParameterizedExecuteNonQuery(InsertNewPassword);   
                    }

                    PasswordChangeErrorDiv.InnerHtml = "<strong>La contrase&ntilde;a se ha actualizado con &eacute;xito.</strong>";
                    PasswordChangeErrorDiv.Attributes["class"] = "alert alert-success";
                    PasswordChangeErrorDiv.Visible = true;
                    ChangeControlValues(false);

                    // ToDo: La sesión debe expirar en X tiempo para que el usuario se vuelva a loguear, 
                    // pero no quisiera terminar la sesión aquí mismo porque el usuario tiene que ver el mensaje
                    // de que su cambió su fue actualizado con éxito.

                }
                // Las contraseñas no coinciden
                else
                {
                    PasswordChangeErrorDiv.InnerHtml = "<strong>La contrase&ntilde;a vieja no coincide.</strong>";
                    PasswordChangeErrorDiv.Attributes["class"] = "alert alert-error";
                    PasswordChangeErrorDiv.Visible = true;
                    ChangeControlValues(true);
                }
            }
            else
            {
                passwordReader.Close();
                PasswordChangeErrorDiv.InnerHtml = "<strong>Error inesperado. Contacte al desarrollador.</strong>";
                PasswordChangeErrorDiv.Attributes["class"] = "alert alert-error";
                PasswordChangeErrorDiv.Visible = true;
                ChangeControlValues(false);
            }
        }
        dbCon.CloseConnection();
    }


    // Verifíca si es SuperAdmin o Admin
    protected Boolean IsSuperAdmin()
    {
        return String.Equals((String)Session["SuperAdminActive"], "Active");
    }


    // Valida que la sesión del usuario sea la correcta para mostrar
    // el contenido de esta página
    protected void SessionValidation()
    {
        _SessionID = (String)Session["SessionID"];
        _UserType = (String)Session["UserType"];

        if (!String.IsNullOrEmpty(_SessionID) && !String.IsNullOrEmpty(_UserType)) return;
        Session.RemoveAll();
        Response.Redirect("~/Default.aspx");
    }

}